#ifndef PREDICTION_FACTORY_H_
#define PREDICTION_FACTORY_H_

#include "Factory.hh"
#include <TimeoutQueue.hh>

//
/**
 * \file PFactory.hh
 * \author  jsk <jsk.jinsubkim@gmail.com>
 * \version 1.0
 *
 * \class PFactory PFactory.hh
 *
 * 기본적인 기능은 Factory 클래스와 같지만, 필요한 워커(GroupWorker)의 개수를 
 * 예측해서 미리 생성한다.
 */
class PFactory : public Factory
{
public:
	/**
	 * \name PFactory
	 */
	PFactory(TimeoutQueue* AssignedQueue);
	
	/**
	 * \name hookWatchdog
	 * 
	 * 
	 * 
	 * \return 
	 * 
	 * 성공할 경우 RETURN_OK, 
	 * 실패할 경우 RETURN_OK가 아닌 값.
	 */
	virtual ResultOf hookWatchdog();
	
// Prediction
protected:
	/**
	 * \name predictNumOfWorker
	 * 
	 * 스레드의 개수를 예측한다.
	 * 
	 * \return 
	 * 
	 * 예측한 스레드의 개수.
	 * 'Misprediction'을 반환한 경우 예측을 하지 않았음을 알린다.
	 */
	virtual USNumber predictNumOfWorker();
	
	/**
	 * \name calcEMA
	 * \param InputVal 입력 값.
	 * 
	 * EMA를 계산한다.
	 * 
	 * \return 
	 * 
	 * 이전 결과 값.
	 */
	virtual double calcEMA(double InputVal);
	
// Member
protected:
	/**
	 * EMA 결과.
	 */
	double ResultOfEMA;
	
// Constant
protected:
	/**
	 * 예측 실패를 나타내는 상수.
	 * 
	 * EMA 결과가 이전보다 작게 나와서 예측을 수행하지 않았을 때를 나타낸다.
	 */
	const static USNumber Misprediction = 0;
	
	/**
	 * 알파.
	 * 
	 * EMA 계산에서 필요한 상수.
	 */
	const static double Alpha = 0.5;
};

#endif //PREDICTION_FACTORY_H_